<?php

class Application_Form_ConvidarBolao extends Zend_Form
{
    //Elementos do Form:
    private $_nomeBolaoSeletor;
    private $_botaoConcluir;
    private $_campoEmails;

    //Mappers:
    private $_bolaoMapper;
    private $_jogoMapper;

    //Outros:    
    private $_idBolaoCorrente;
    private $_emailDono;
    private $_listaEmails;

    //Construtor:
    public function __construct(Application_Model_BolaoMapper $bolao,
                                Application_Model_JogoMapper $jogo,
                                $idBolaoCorrente, $email,
                                $post = null, $options = null)
    {
        $this->_bolaoMapper = $bolao;
        $this->_jogoMapper = $jogo;
        $this->_idBolaoCorrente = $idBolaoCorrente;
        $this->_emailDono = $email;
        parent::__construct($options);        
        
    }

    public function init()
    {
        /* Form Elements & Other Definitions Here ... */
       $this->setMethod('post');
       $this->setDecorators(array(
            'FormElements',
            array('Description', array('placement' => 'prepend')),
            'Form'
        ));

       $this->_listaEmails = array();
       if($this->adicionaNomesBolao() == false)
            echo 'Você ainda não criou um bolão para convidar seus amigos.';
            else $this->prepararForm();
             
    }

    private function prepararForm()
    {
        $this->criarCampoEmail();
        $this->criarBotaoConcluir();        
    }

    //Adiciona um seletor de boloes ao form:
    private function adicionaNomesBolao()
    {
        $this->_nomeBolaoSeletor = new Zend_Form_Element_Select('nomeBolao');

        $this->_nomeBolaoSeletor->setLabel('Nome do Bolão')->addMultioption(null, '');

        $listaBoloes = $this->_bolaoMapper->buscaBolaoPorUsuario($this->_emailDono);       

        //se existe algum bolao:
        if(count($listaBoloes) != 0){

            foreach($listaBoloes as $umBolao) {
                
                $nome = $umBolao->nome;
                $id = $umBolao->id;
                $idJogo = $umBolao->id_jogo;

                $jogo = $this->_jogoMapper->fetch($idJogo);
                $dataJogo = $jogo->getData();

                //comparando datas para certificar que o bolão corresponde a um jogo futuro.
                //Se o jogo já passou, não adicionamos o bolão neste seletor.
                $dataAtual = new Zend_Date();
                if($dataJogo->isLater($dataAtual)){
                    //retorna o segundo argumento para o seletor visível ao usuário
                    //e o primeiro argumento retorna para o controller.
                    $this->_nomeBolaoSeletor->addMultiOption($id, $nome);
                    $this->_nomeBolaoSeletor->setValue($id);
                }
            }
            $this->addElement($this->_nomeBolaoSeletor);
            if($this->_idBolaoCorrente != null)
               $this->_nomeBolaoSeletor->setValue($this->_idBolaoCorrente);
            return true;
        } else {
            //não existe boloes cadastrados:
            $this->_nomeBolaoSeletor->addMultiOption(0, 'Sem bolões cadastrados');
            $this->addElement($this->_nomeBolaoSeletor);
            $this->_nomeBolaoSeletor->setValue(0);
            return false;
        }

    }//fim adicionaNomesBolao

    private function criarCampoEmail()
    {
        if(!isset($this->_campoEmails))
        {
            //Adicionando a text Area para pegar email dos convidados:
            $this->_campoEmails = new Zend_Form_Element_Textarea('emails');
            $this->_campoEmails->setLabel('Insira o e-mail de seus amigos, separado por vírgulas:');
            $this->_campoEmails->setRequired(true);
            $this->addElement($this->_campoEmails);
        }
    }

    private function criarBotaoConcluir()
    {
        if(!isset($this->_botaoConcluir))
        {
            //Adicionando botao Concluir:
            $this->_botaoConcluir = new Zend_Form_Element_Submit('convidarAmigos');
            $this->_botaoConcluir->setLabel('Convidar amigos')->setIgnore(true);
            $this->addElement($this->_botaoConcluir);
        }
    }
    
    public function validarCampoEmail()
    {
        if($this->_campoEmails->isValid($this->_campoEmails->getValue())){
            $validador = new Zend_Validate_EmailAddress();
            $listaEmail = $this->_campoEmails->getValue();
            //corta a string por virgulas e valida cada parte como um email:
            $token = strtok($listaEmail, ",");
            while($token){
                $umEmail = trim($token);
                if($validador->isValid($umEmail) == false){
                    $this->_listaEmails = array();
                    return false;
                }
                $this->_listaEmails[] = $umEmail;
                $token = strtok(",");
            }
            return true;

        } else return false;
    }

    public function isValid ($post)
    {
        parent::isValid($post);
        //Se o campo de emails estiver não nulo e conter emails corretos, o post é válido:
        return ($this->_botaoConcluir->isChecked() && $this->validarCampoEmail());
    }

    public function getListaEmails()
    {
        return $this->_listaEmails;
    }

}//fim Classe

